home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Science⁄Math / VideoToolbox / VideoToolboxSources / Mean.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-10  |  2.1 KB  |  124 lines  |  [TEXT/KAHL]

  1. /*
  2. Mean.c
  3. Quickly computes mean (and optionally the standard deviation) of an array of samples. 
  4. The loops do only one memory access per iteration.
  5.  
  6. HISTORY:
  7. 9/16/90    dgp    wrote it.
  8. 1/10/94    dgp added MeanC and MeanUC that operate on arrays of signed char and 
  9.             unsigned char.
  10.             Optimized to minimize memory accesses when compiled by THINK C 6.01.
  11. */
  12. #include "VideoToolbox.h"
  13. #include <math.h>
  14.  
  15. #if 0
  16.     double Mean(double x[],long n,double *sdPtr)
  17.     // Original version, not optimized.
  18.     {
  19.         register double s,mean,xx;
  20.         register long i;
  21.         
  22.         s=0.0;
  23.         for(i=0;i<n;i++) s+=x[i];
  24.         mean=s/n;
  25.         if(sdPtr!=NULL){
  26.             s=0.0;
  27.             for(i=0;i<n;i++){
  28.                 xx=x[i];
  29.                 s+=xx*xx;
  30.             }
  31.             *sdPtr=sqrt((s-n*mean*mean)/(n-1));
  32.         }
  33.         return mean;
  34.     }
  35. #else    
  36.     double Mean(double x[],long n,double *sdPtr)
  37.     // x[] is double
  38.     // Optimized to minimize memory accesses when compiled by THINK C 6.01
  39.     {
  40.         register double s;
  41.         register long i;
  42.         double *p;
  43.     
  44.         p=x;
  45.         if(sdPtr!=NULL){
  46.             register double ss;
  47.             register double xx;
  48.     
  49.             s=ss=0.0;
  50.             for(i=n;i>0;i--){
  51.                 s+=xx=*p++;
  52.                 ss+=xx*xx;
  53.             }
  54.             s/=n;
  55.             *sdPtr=sqrt((ss-n*s*s)/(n-1));
  56.         }else{
  57.             s=0.0;
  58.             for(i=n;i>0;i--) s+=*p++;
  59.             s/=n;
  60.         }
  61.         return s;
  62.     }
  63. #endif
  64.  
  65. double MeanC(char x[],long n,double *sdPtr);
  66.  
  67. double MeanC(char x[],long n,double *sdPtr)
  68. // x[] is char
  69. // Optimized to minimize memory accesses when compiled by THINK C 6.01
  70. {
  71.     register double s;
  72.     register long i;
  73.     register char *p;
  74.  
  75.     p=x;
  76.     if(sdPtr!=NULL){
  77.         register double ss;
  78.         register long xx;
  79.  
  80.         s=ss=0.0;
  81.         for(i=n;i>0;i--){
  82.             s+=xx=*p++;
  83.             ss+=xx*xx;
  84.         }
  85.         s/=n;
  86.         *sdPtr=sqrt((ss-n*s*s)/(n-1));
  87.     }else{
  88.         s=0.0;
  89.         for(i=n;i>0;i--) s+=*p++;
  90.         s/=n;
  91.     }
  92.     return s;
  93. }
  94.  
  95. double MeanUC(unsigned char x[],long n,double *sdPtr);
  96.  
  97. double MeanUC(unsigned char x[],long n,double *sdPtr)
  98. // x[] is unsigned char
  99. // Optimized to minimize memory accesses when compiled by THINK C 6.01
  100. {
  101.     register double s;
  102.     register long i;
  103.     register unsigned char *p;
  104.  
  105.     p=x;
  106.     if(sdPtr!=NULL){
  107.         register double ss;
  108.         register long xx;
  109.  
  110.         s=ss=0.0;
  111.         for(i=n;i>0;i--){
  112.             s+=xx=*p++;
  113.             ss+=xx*xx;
  114.         }
  115.         s/=n;
  116.         *sdPtr=sqrt((ss-n*s*s)/(n-1));
  117.     }else{
  118.         s=0.0;
  119.         for(i=n;i>0;i--) s+=*p++;
  120.         s/=n;
  121.     }
  122.     return s;
  123. }
  124.